/**
 * 给定数组与一个操作序列，每次将数组[s...e]范围内减一
 * 问所有操作完毕，能否使得数组非正
 * 差分，其实可以不用树状数组，直接在差分数组上做单点操作即可
 */
struct FenwickTree{ // 树状数组

using value_type = long long int;
using vec_type = vector<value_type>;

int n;
vec_type c;

FenwickTree() = default;

static int lowbit(int x){return x & -x;}

void init(int nn){this->c.assign((this->n=nn) + 1, 0);}

void modify(int pos, value_type delta){
    for(int i=pos;i<=this->n;i+=lowbit(i)) this->c[i] += delta;
}

value_type query(int pos)const{
    value_type ans = 0;
    for(int i=pos;i;i-=lowbit(i)) ans += this->c[i];
    return ans;
}

value_type query(int s, int e)const{return this->query(e) - this->query(s - 1);}

};


class Solution {
public:
    bool isZeroArray(vector<int>& nums, vector<vector<int>>& queries) {
        int n = nums.size();
        FenwickTree Bt;
        Bt.init(n + 1);
        for(const auto & v : queries){
            int a = v[0] + 1;
            int b = v[1] + 1;
            Bt.modify(a, +1);
            Bt.modify(b + 1, -1);
        }
        for(int i=0;i<n;++i){
            int tmp = Bt.query(i + 1);
            if(tmp < nums[i]) return false;
        }
        return true;
    }
};